package fsmsim.kernel;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Polygon;
import java.util.ArrayList;


public class Estado {
	String _nombre;
	int _x,_y;
	boolean _inicial,_final;
	
	ArrayList<Transicion> _transiciones=new ArrayList<Transicion>();
	ArrayList<Transicion> _backTransiciones=new ArrayList<Transicion>();
	
	public Estado(String nombre, int x, int y){
		_nombre=nombre;
		_x=x;
		_y=y;
	}
	public String getNombre()
	{
		return _nombre;
	}
	public boolean isInicial(){
		return _inicial;
	}
	public boolean isFinal(){
		return _final;
	}
	public int getX(){
		return _x;
	}
	public int getY(){
		return _y;
	}
	public void setInicial(boolean inicial) {
		_inicial=inicial;
	}
	public void Draw(Graphics2D g2)
	{
		Draw(g2,Color.GREEN,Color.BLACK);
	}
	public void Draw(Graphics2D g2, Color fondo,Color fuente){
		Color c=g2.getColor();
		g2.setColor(fondo);
        g2.fillOval(_x-10, _y-10,20,20);
        if(_final){
            g2.drawOval(_x-15,_y-15,30,30);
        }
        g2.setColor(fuente);
        g2.drawString(_nombre, _x+10, _y+20);
        g2.drawOval(_x-10, _y-10, 20, 20);
        if(_inicial){
            g2.setColor(fondo);
            g2.fillPolygon(new Polygon (new int[]{_x-25,_x-20,_x-25},new int[]{_y-10,_y,_y+10},3 ) );
        }
        g2.setColor(c);
	}
	public void chPosicion(Point nuevaPosicion,boolean update) {
		
		_x= nuevaPosicion.x;
		_y= nuevaPosicion.y;
		if(update) updatePosicion();
	}
	public void chPosicion(Point nuevaPosicion){
		chPosicion(nuevaPosicion,false);
	}
	public void updatePosicion(Point nuevaPosicion){
		chPosicion(nuevaPosicion);
		updatePosicion();
	}
	public void updatePosicion() {
		for(Transicion t : _transiciones)
			t.updateLocation();
		for(Transicion t : _backTransiciones)
			t.updateLocation();
	}
	protected void addTransicion(Transicion transicion) {
		// FIXME : Falta por organizar mejor la lista.
		if(_transiciones.size()==0 ||(  transicion.getLecturaCinta()==FSM.SIMB_COMODIN) ){
			_transiciones.add(transicion);
		}else{
				_transiciones.add(0, transicion);
		}
		
		if(transicion.getOrigen()!=transicion.getDestino()){
			 transicion.getDestino()._backTransiciones.add(transicion);
		}
	}
	public ArrayList<Transicion> getTransiciones() {
		// TODO : Quiza convenga clonar la lista.
		return _transiciones;
	}
	protected void setNombre(String nuevoNombre){
		_nombre=nuevoNombre;
	}
	protected void rmTransiciones() {
		for(Transicion t : _transiciones){
			t.getDestino()._backTransiciones.remove(t);
		}
		for(Transicion t: _backTransiciones){
			t.getOrigen()._transiciones.remove(t);
		}
	}
	protected void setFinal(boolean isFinal) {
		_final=isFinal;
	}
	protected void rmTransicion(Transicion transicion) {
		_transiciones.remove(transicion);
		transicion.getDestino()._backTransiciones.remove(transicion);
	}
	
}
